home *** CD-ROM | disk | FTP | other *** search
/ Network CD 2 / Network CD - Volume 2.iso / programs / internet / dnet / dshterm1_0.lha / lib / st / dbyteops.s < prev    next >
Encoding:
Text File  |  1992-02-04  |  5.4 KB  |  196 lines

  1. ********************************************************************
  2. ; BORROWED FROM SUPLIB32 (C) Mathew Dillon
  3. ; these are optimized byte operation routines
  4. ; TABS to 4
  5. ; Assemble with genam (devpac) 3 or similar
  6. ; 680x0 compatible routines
  7. ********************************************************************
  8.         OPT        o+            ;optimize
  9.         OPT        l+            ;link
  10.  
  11.         xdef    _dbcmp        ; compare two blocks of memory
  12.         xdef    _dbmov        ; optimized proc'r move
  13.         xdef    _dbset        ; Set a block of memory to (byte val)
  14.         xdef    _dbzero        ; Zero a block of memory
  15.  
  16. ********************************************************************
  17. _dbcmp    ;   BCMP(src:a0, dst:a1, len:d0)
  18. ********************************************************************
  19.         tst.l        d0
  20.         beq.s        db_csucc
  21.         cmp.w        D0,D0                            ;set Z bit
  22.         bra.s        db_c2
  23. db_c1    cmp.b        (A0)+,(A1)+
  24. db_c2    dbne        D0,db_c1
  25.         bne.s        db_cfail
  26.         sub.l        #$10000,D0                        ;handle > 32Kb
  27.         bcc.s        db_c1
  28. db_csucc
  29.         moveq.l     #1,D0
  30.         rts
  31. db_cfail
  32.         moveq.l     #0,D0
  33.         rts
  34.  
  35.  
  36. ********************************************************************
  37. _dbmov    ;   BMOV(src:a0, dst:a1, len:d0)
  38. ********************************************************************
  39.         cmp.l        A0,A1                            ;direction ?
  40.         beq            db_mend
  41.         bls.s        db_mup
  42. ; COPY DESCENDING
  43. db_mdown
  44.         adda.l        D0,A0                            ;descending copy
  45.         adda.l        D0,A1
  46.         move.w        A0,D1                            ;CHECK WORD ALIGNED
  47.         btst.l        #0,D1
  48.         bne.s        db_mdown1
  49.         move.w        A1,D1
  50.         btst.l        #0,D1
  51.         bne.s        db_mdown1
  52.         cmp.l        #259,D0                         ;chosen by calculation.
  53.         blo.s        db_mdown8
  54.  
  55.         move.l        D0,D1                            ;overhead for bmd44: ~360
  56.         divu.w        #44,D1
  57.         bvs.s        db_mdown8                        ;too big (> 2,883,540)
  58.         movem.l        D2-D7/A2-A6,-(sp)                ;use D2-D7/A2-A6 (11 regs)
  59.         moveq.l        #11*4,D0
  60.         bra.s        db_md44b
  61. db_md44a
  62.         sub.l        D0,A0                            ;8 total 214/44bytes
  63.         movem.l        (A0),D2-D7/A2-A6                ;12 + 8*11  4.86 cycles/byte
  64.         movem.l        D2-D7/A2-A6,-(A1)                ; 8 + 8*11
  65. db_md44b
  66.         dbf.w        D1,db_md44a                        ;10
  67.         swap        D1                                ;D0<15:7> already contain 0
  68.         move.w        D1,D0                            ;D0 = remainder
  69.         movem.l        (sp)+,D2-D7/A2-A6
  70. db_mdown8
  71.         move.w        D0,D1                            ;D1<2:0> = #bytes left later
  72.         lsr.l        #3,D0                            ;divide by 8
  73.         bra.s        db_md8b
  74. db_md8a    move.l        -(A0),-(A1)                        ;20 total 50/8bytes
  75.         move.l        -(A0),-(A1)                        ;20 = 6.25 cycles/byte
  76. db_md8b    dbf.w        D0,db_md8a                        ;10
  77.         sub.l        #$10000,D0
  78.         bcc.s        db_md8a
  79.         move.w        D1,D0                            ;D0 = 0 to 7 bytes
  80.         and.l        #7,D0
  81.         bne.s        db_mdown1
  82.         rts
  83. db_md1a    
  84.         move.b        -(A0),-(A1)                        ;12 total 22/byte
  85. db_mdown1
  86. db_md1b    dbf.w        D0,db_md1a                        ;10
  87.         sub.l        #$10000,D0
  88.         bcc.s        db_md1a
  89.         rts
  90. ; COPY ASCENDING
  91. db_mup    move.w        A0,D1                            ;CHECK WORD ALIGNED
  92.         btst.l        #0,D1
  93.         bne.s        db_mup1
  94.         move.w        A1,D1
  95.         btst.l        #0,D1
  96.         bne.s        db_mup1
  97.         cmp.l        #259,D0                            ;chosen by calculation
  98.         blo.s        db_mup8
  99.         move.l        D0,D1                            ;overhead for bmu44: ~360
  100.         divu        #44,D1
  101.         bvs.s        db_mup8                            ;too big (> 2,883,540)
  102.         movem.l        D2-D7/A2-A6,-(sp)                ;use D2-D7/A2-A6 (11 regs)
  103.         moveq.l        #11*4,D0
  104.         bra.s        db_mu44b
  105. db_mu44a
  106.         movem.l     (A0)+,D2-D7/A2-A6                ;12 + 8*11 214/44bytes
  107.         movem.l     D2-D7/A2-A6,(A1)                ;8  + 8*11  4.86 cycles/byte
  108.         add.l        D0,A1                            ;8
  109. db_mu44b
  110.         dbf.w        D1,db_mu44a                        ;10
  111.         swap        D1                                ;D0<15:7> already contain 0
  112.         move.w        D1,D0                            ;D0 = remainder
  113.         movem.l        (sp)+,D2-D7/A2-A6
  114. db_mup8    move.w        D0,D1                            ;D1<2:0> = #bytes left later
  115.         lsr.l        #3,D0                            ;divide by 8
  116.         bra.s        db_mu8b
  117. db_mu8a    move.l        (A0)+,(A1)+                        ;20 total 50/8bytes
  118.         move.l        (A0)+,(A1)+                        ;20 = 6.25 cycles/byte
  119. db_mu8b    dbf.w        D0,db_mu8a                        ;10
  120.         sub.l        #$10000,D0
  121.         bcc.s        db_mu8a
  122.         move.w        D1,D0                            ;D0 = 0 to 7 bytes
  123.         and.l        #7,D0
  124.         bne.s        db_mup1
  125.         rts
  126. db_mu1a    move.b        (A0)+,(A1)+
  127. db_mup1
  128. db_mu1b    dbf.w        D0,db_mu1a
  129.         sub.l        #$10000,D0
  130.         bcc.s        db_mu1a
  131. db_mend    rts
  132.  
  133.  
  134.  
  135.  
  136. ********************************************************************
  137. _dbzero:    ;   BZERO(buffer:a0, len)
  138. ********************************************************************
  139.         moveq.l        #0,D1
  140. ********************************************************************
  141. _dbset:    ;   BSET(buffer:a0, len:d0, byte:d1)
  142. ********************************************************************
  143. db_z0
  144.         add.l        D0,A0                            ;start at end of address
  145.         cmp.l        #40,D0                            ;unscientifically chosen
  146.         bls.s        db_s2
  147.         bra.s        db_s10
  148. db_s1    move.b        D1,-(A0)
  149. db_s2    dbf.w        D0,db_s1                        ;any count < 65536
  150.         rts
  151. ; at least 2 bytes in count (D0)
  152. db_s10    movem.l        D2-D7/A2-A6,-(sp)                ;ant count > 4
  153.         move.l        A0,D2
  154.         btst.l        #0,D2                            ;is it aligned?
  155.         beq.s        db_s22
  156.         move.b        D1,-(A0)                        ;no, copy one byte
  157.         subq.l        #1,D0
  158. db_s22    andi.l        #$FF,D1                            ;expand data D1.B -> D2-D7/A1-A6
  159.         move.l        D1,D2                            ;D1 000000xx   D2 000000xx
  160.         asl.w        #8,D2                            ;                  0000xx00
  161.         or.w        D2,D1                            ;    0000xxxx
  162.         move.w        D1,D2                            ;    0000xxxx      0000xxxx
  163.         swap        D2                                ;    0000xxxx      xxxx0000
  164.         or.l        D1,D2                            ;D2.L
  165.         move.l        D2,D3
  166.         move.l        D2,D4
  167.         move.l        D2,D5
  168.         move.l        D2,D6
  169.         move.l        D2,D7
  170.         move.l        D2,A1
  171.         move.l        D2,A2
  172.         move.l        D2,A3
  173.         move.l        D2,A4
  174.         move.l        D2,A5
  175.         move.l        D2,A6                            ;D2-D7/A1-A6 (12 registers)
  176.         moveq.l        #12*4,D1                        ;bytes per transfer (48)
  177. db_s30    sub.l        D1,D0                            ;pre subtract
  178.         bmi.s        db_s40
  179. db_s31    movem.l        D2-D7/A1-A6,-(A0)
  180.         sub.l        D1,D0
  181.         bpl.s        db_s31
  182. db_s40    add.w        D1,D0                            ;less than 48 bytes remaining
  183.         move.w        #4,D1                            ;by 4's
  184.         sub.w        D1,D0
  185.         bmi.s        db_s50
  186. db_s41    move.l        D2,-(A0)
  187.         sub.w        D1,D0
  188.         bpl.s        db_s41
  189. db_s50    add.w        D1,D0
  190.         bra.s        db_s52
  191. db_s51    move.b        D2,-(A0)                        ;by 1's
  192. db_s52    dbf.w        D0,db_s51
  193.         movem.l        (sp)+,D2-D7/A2-A6
  194.         rts
  195.  
  196.